import os
import requests

from flask import Blueprint, request, jsonify
from openai import OpenAI

from utils.file import encode_image, gen_filename
from utils.paint import drawImg

from rdkit import Chem
from rdkit.Chem import Draw
import pubchempy as pcp

image_identify = Blueprint('identify_api', __name__)

client = OpenAI(
    api_key="example_api_key",
    base_url="example_base_url",
)


@image_identify.route('/v1/object_identify', methods=['POST'])
def object_identify():
    data = request.json.get('data')
    # 简笔画图片路径
    file_path = os.path.join("static", "files", "line_drawing.png")
    drawImg(data, file_path)
    # 识别图片内容
    res = ai_image_identify(file_path)
    return jsonify({
        'code': 200,
        'message': res,
        'data': get_object(res)
    })


# 识别图片内容
def ai_image_identify(image_path):
    image_base64 = encode_image(image_path)
    completion = client.chat.completions.create(
        model="qwen-vl-max-latest",
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "image_url",
                        "image_url": {"url": f"data:image/jpeg;base64,{image_base64}"},
                    },
                    {"type": "text", "text": """
                    分析给定的图片，并判断其是否可能是以下图标之一：电话（手机）、短信、闹钟（时钟）。
                    如果图片包含电话界面、拨号盘、电话天线等元素，请识别为‘电话’。
                    如果图片包含短信或消息界面、文本气泡，或与短信相关的通知，请识别为‘短信’。
                    如果图片包含闹钟界面、正在设定的闹钟，或时钟应用中的闹钟设置，请识别为‘闹钟’。
                    输出结果是：电话、短信、闹钟即可
                    """},
                ],
            }
        ],
    )
    return completion.choices[0].message.content


def get_object(value):
    if value == '电话':
        return 1
    elif value == '闹钟':
        return 2
    else:
        # 短信
        return 3


# 生成化学分子式图片并保存
def generate_chemical_formula_image(smiles):
    filename = gen_filename() + '.png'
    filepath = os.path.join('static', 'chemistry', filename)
    mol = Chem.MolFromSmiles(smiles)
    img = Draw.MolsToGridImage([mol], molsPerRow=1)
    # 直接保存 PIL 图像
    img.save(filepath)
    return os.path.join('chemistry', filename)


# 使用 PubChem API 将化学式转换为 SMILES
def formula_to_smiles(formula):
    try:
        compounds = pcp.get_compounds(formula, 'formula')  # 通过化学式查找化合物
        if compounds:
            return compounds[0].isomeric_smiles  # 返回第一个匹配项的 SMILES
    except Exception as e:
        print(f"查询失败: {e}")
    return None  # 没有找到对应的 SMILES


# 大模型识别图片内容
def text_identify(filepath):
    image_base64 = encode_image(filepath)
    completion = client.chat.completions.create(
        model="qwen-vl-max-latest",
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "image_url",
                        "image_url": {"url": f"data:image/jpeg;base64,{image_base64}"},
                    },
                    {"type": "text", "text": """
                        请直接提取图片中的文字、字母或数字，并输出识别结果，无需分析过程或解释。
                        """},
                ],
            }
        ],
    )
    print(completion)
    return completion.choices[0].message.content
